package finalapp.exercise.activities;


import android.app.Activity;
import android.app.Dialog;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import finalapp.exercise.R;
import finalapp.exercise.db.LocationsDB.Places;

/**
* Esta es la clase que se encarga de mostrar una localizacion
* y tambien abre la actividad de editar la localizacion si se
* aprieta un boton
* 
* @author Alejandro Villamarin
*
*/
public class EditarLugarActivity extends Activity{

	/**
	 * Constante que usaremos para obtener el resultado de llamar a la activity de seleccionar imagen
	 */
	private static final int SELECT_IMAGE = 1;
	
	/**
	 * flag que usaremos para saber si debemos crear un nuevo lugar o editarlo
	 */
	private boolean nuevaLocalizacion;
			
	/**
	 * EditText que usaremos para que el usuario introduzca el titulo
	 */
	private EditText mNameText;
	
	/**
	 * EditText que usaremos para que el usuario introduzca la descripcion
	 */
	private EditText mDescText;
	
	/**
	 * ImageView que usaremos para que el usuario pueda seleccionar una imagen
	 */
	private ImageView mPicture;
	
	/**
	 * Boton que usaremos para crear una nueva localizacion
	 */
	private Button botonCrear;
	
	/**
	 * Boton que usaremos para guardar los cambios en una localizacion existente
	 */
	private Button botonEditar;
	
	/**
	 * Boton que usaremos para eliminar una localizacion existente
	 */
	private Button botonEliminar;
		
	/**
	 * Variable que usaremos para almacenar la latitud pasada
	 */
	private double latitud;

	/**
	 * Variable que usaremos para almacenar la longitud pasada
	 */
	private double longitud;
	
	/**
	 * Variable que usaremos para almacenar la uri de la imagen pasada
	 */
	private String uriImagen;

	/**
	 * Variable que usaremos para almacenar el nombre de la localizacion pasada
	 */
	private String nombre;

	/**
	 * Variable que usaremos para almacenar la descripcion pasada
	 */
	private String desc;
	
	/**
	 * Variable que usaremos para almacenar la id de la localizacion
	 */
	private int mRowId;
	

    /**
     * Custom Dialog usado para mostrar mensajes de error o de confirmacion
     */
	private Dialog dialogo;

      /**
       * Metodo que se llama cuando se crea la activity
       */
	  @Override
	  protected void onCreate(Bundle savedInstanceState) {
	        
		  super.onCreate(savedInstanceState);
	        
	      //obtenemos los datos pasados a traves del bundle
	      Bundle extras = getIntent().getExtras();
	      //primero obtenemos el flag que nos indica si se trata de una
	      //nueva localizacion o de la edicion de una existente (si venimos
	      //del mapa o del listado)
	      nuevaLocalizacion = extras.getBoolean("NUEVA");
	      //obtenemos latitud y longitud porque nos haran falta en cualquier caso
	      //obtenemos longitud y latitud pasadas, ya que seran el criterio de busqueda del registro en la bd
	      latitud = extras.getDouble(Places.LATITUDE);
	      longitud = extras.getDouble(Places.LONGITUDE);
	      //obtenemos la uri de la imagen
	      uriImagen = extras.getString(Places.PICTURE);
	        
	      //asignamos el layout y el titulo
	      setContentView(R.layout.location_edit);
	      setTitle(R.string.editar_titulo);
	        
	      //obtenemos los EditText
	      mNameText = (EditText)findViewById(R.id.locationName);
	      mDescText = (EditText)findViewById(R.id.locationDesc);
	        
	      //obtenemos el ImageView
	      mPicture = (ImageView)findViewById(R.id.locationPic);
	        
	      //obtenemos los botones
	      botonCrear = (Button)findViewById(R.id.botonCrear);
	      botonEditar = (Button)findViewById(R.id.botonEditar);
	      botonEliminar = (Button)findViewById(R.id.botonBorrar);
        	
	      //Indicamos a la imagen que se ajuste a las dimensiones del drawable
	      mPicture.setAdjustViewBounds(true);
	      //establecemos altura y anchura maxima
	      mPicture.setMaxHeight(300);
	      mPicture.setMaxWidth(300);
	        
	      //si hay que crear una nueva localizacion, hay que mostrar unos botones u otros
	      if (nuevaLocalizacion){
	    	  //debemos mostrar solo el boton de Crear
	    	  botonCrear.setVisibility(View.VISIBLE);
	    	  botonEditar.setVisibility(View.INVISIBLE);
	    	  botonEliminar.setVisibility(View.INVISIBLE);
	    	  //como es una nueva, no hay que poner nada en nombre y desc
	    	  mNameText.setText("");
	    	  mDescText.setText("");
	    	  //cargaremos una imagen por defecto al principio 
	    	  mPicture.setImageResource(R.drawable.undefined);
	    	  //Añadimos un listener para el evento onClick
	    	  botonCrear.setOnClickListener(new OnClickListener(){
	    		  @Override
				  public void onClick(View v) {
	    			  //insertamos una localizacion
					  insertarLocalizacion();
	    		  }
	    	  });
	        	
	      }
	      else{
	    	  //mostramos los botones de editar y eliminar
	    	  botonCrear.setVisibility(View.INVISIBLE);
	    	  botonEditar.setVisibility(View.VISIBLE);
	    	  botonEliminar.setVisibility(View.VISIBLE);
	    	  //Ponemos en los campos EditText los datos pasados como parametros
	    	  mNameText.setText(extras.getString(Places.NAME));
	    	  //ponemos el cursor al final del texto
	    	  mNameText.setSelection(mNameText.getText().length());
	    	  mDescText.setText(extras.getString(Places.DESC));
	    	  //ponemos el cursor al final del texto
	    	  mDescText.setSelection(mDescText.getText().length());
	    	  //obtenemos la id de la localizacion pasada como parametro
	    	  mRowId = extras.getInt(Places._ID);
	    	  //obtenemos la descripcion y la uri de la imagen a cargar
	    	  if (!obtenerCampos(mRowId)){
	    		  desc = "Sin definir";
	    		  uriImagen = "";
	    	  }
	    	  
	    	  //si la hemos obtenido, la cargamos
	    	  if (uriImagen != null){
	    		  if (!TextUtils.isEmpty(uriImagen)){

	    			Uri uri = Uri.parse(uriImagen);
	  				String pathImagen = getPath(uri);
					Bitmap bm = BitmapFactory.decodeFile( pathImagen, null );
					mPicture.setImageBitmap(bm);
	
	    		  }
	    		  else{
	    			  mPicture.setImageResource(R.drawable.undefined);
	    		  }
	    	  }
	    	  else{
	    		  mPicture.setImageResource(R.drawable.undefined);
	    	  }
	    	  
	    	  //Añadimos un listener para el evento onClick de los botones editar y eliminar
	    	  botonEditar.setOnClickListener(new OnClickListener(){
	    		  @Override
				  public void onClick(View v) {
	    			  //insertamos una localizacion
					  modificarLocalizacion();
	    		  }
	    	  });
	    	  botonEliminar.setOnClickListener(new OnClickListener(){
	    		  @Override
				  public void onClick(View v) {
	    			  //insertamos una localizacion
					  eliminarLocalizacion();
	    		  }
	    	  });
	      }
	        
	      //añadimos un listener a la imagen para que si se hace click se muestre 
	      //un activity que permite seleccionar la imagen a cargar
	      mPicture.setOnClickListener(new OnClickListener(){
	    	  @Override
	    	  public void onClick(View v) {
	    		  seleccionarImagen();
	    	  }
	      });      	        
	  }
	  
	  /**
	   * Metodo que se encarga de llamar al intent que selecciona una imagen del dispositivo
	   * 
	   */
	  private void seleccionarImagen(){
		  		  
		  startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), SELECT_IMAGE);
	  }
	  
	  /**
	   * Este metodo busca en la base de datos los campos que no hemos podido pasar en el bundle
	   * como son la descripcion y la uri de la imagen
	   * 
	   * @param 	idLoc	El id de la localizacion	
	   * @return	TRUE si hemos conseguido obtener la descripcion y posiblemente el Uri de la imagen
	   */
	  private boolean obtenerCampos(int idLoc) {
			    	
		  //Obtenemos la localizacion que necesitamos de la base de datos
		  String where = Places._ID + "=" + idLoc;
		  final String[] columnas = new String[] { Places._ID, Places.NAME, Places.DESC, Places.LATITUDE, Places.LONGITUDE, Places.PICTURE};
		  Uri uri = Uri.parse("content://finalapp.exercise.db.locationsprovider/location");
		  //obtenemos el cursor
		  Cursor cursor = managedQuery(uri, columnas, where, null, null);
			   		
		  //comprobamos que nos haya devuelto algo
		  if (cursor.moveToFirst()) {
			  //obtenemos la descripcion, que esta en el indice 2 
			  desc = cursor.getString(2);
			  uriImagen = cursor.getString(5);
			  //comprobamos que la descripcion tiene algo, ya que es imposible que no lo tenga (la imagen sip)
			  if (desc != null){
				  if (!TextUtils.isEmpty(desc))
					  return true;
				  else
					  return false;
			  }
			  else{
				  return false;
			  }
		  }
		  return false;
	  }
	    
	  /**
	   * Metodo que se encarga de insertar una nueva localizacion en la base de datos
	   *
	   */
	  private void insertarLocalizacion(){
	    	
		  //añadimos la nueva localizacion en la base de datos y mostramos un dialog
		  ContentValues values = new ContentValues();
		  //validamos los campos
		  nombre = mNameText.getText().toString();
		  desc = mDescText.getText().toString();
			
		  if (!TextUtils.isEmpty(nombre) && nombre != null){
			  if (!TextUtils.isEmpty(desc) && desc != null){
				  //si todo esta bien procedemos a grabar en la bd
				  values.put(Places.NAME, nombre);
				  values.put(Places.DESC, desc);
				  values.put(Places.LATITUDE, latitud);
				  values.put(Places.LONGITUDE, longitud);
				  values.put(Places.PICTURE, uriImagen);
				  //obtenemos la uri para hacer el insert
				  Uri uri = Uri.parse("content://finalapp.exercise.db.locationsprovider/location");
				  getContentResolver().insert(uri, values);
				  String resultado = "Localizacion insertada con exito.";
				  mostrarDialogoConfirmacion(resultado);
				  //thread.start();
			  }
			  else{
				  //mostramos un mensaje de error en un toast
				  String error = "La descripcion no puede estar vacia";
				  mostrarDialogoError(error);
				  return;
			  }
		  }
		  else{
			  //mostramos un mensaje de error en un toast
			  String error = "El titulo no puede estar vacio";
			  mostrarDialogoError(error);
			  return;
		  }	
	  }
	  
	  /**
	   * Metodo que se encarga de modificar una localizacion en la base de datos
	   * 
	   */
	  private void modificarLocalizacion(){
	    	
		  //añadimos la nueva localizacion en la base de datos y mostramos un dialog
		  ContentValues values = new ContentValues();
		  //validamos los campos
		  nombre = mNameText.getText().toString();
		  desc = mDescText.getText().toString();
		  
			
		  if (!TextUtils.isEmpty(nombre) && nombre != null){
			  if (!TextUtils.isEmpty(desc) && desc != null){
				  //si todo esta bien procedemos a grabar en la bd
				  values.put(Places.NAME, nombre);
				  values.put(Places.DESC, desc);
				  values.put(Places.LATITUDE, latitud);
				  values.put(Places.LONGITUDE, longitud);
				  values.put(Places.PICTURE, uriImagen);
				  //obtenemos la uri para hacer la modificacion
				  Uri uri = ContentUris.withAppendedId(Uri.parse("content://finalapp.exercise.db.locationsprovider/location"), mRowId);
				  getContentResolver().update(uri, values, null, null);
				  String resultado = "Localizacion modificada con exito";
				  mostrarDialogoConfirmacion(resultado);

			  }
			  else{
				  //mostramos un mensaje de error en un toast
				  String error = "La descripcion no puede estar vacia";
				  mostrarDialogoError(error);
				  return;
			  }
		  }
		  else{
			  //mostramos un mensaje de error en un toast
			  String error = "El titulo no puede estar vacio";
			  mostrarDialogoError(error);
			  return;
		  }	
	  }
	  
	  /**
	   * Metodo que se encarga de eliminar una localizacion en la base de datos
	   * 
	   */
	  private void eliminarLocalizacion(){
		  
		  //obtenemos la uri para hacer la eliminacion
		  Uri uri = ContentUris.withAppendedId(Uri.parse("content://finalapp.exercise.db.locationsprovider/location"), mRowId);
		  int resultado = getContentResolver().delete(uri, null, null);
		  String mensaje;
		  //comprobamos si la eliminacion ha ido bien
		  if (resultado==-1){
			  mensaje = "No se ha podido eliminar la localizacion";
			  mostrarDialogoError(mensaje);
		  }
		  else{
			  mensaje = "Se ha eliminado la localizacion con exito";
			  mostrarDialogoConfirmacion(mensaje);
		  }	  
	  }
	  
	  /**
	   * Metodo que muestra un dialogo personalizado de confirmacion
	   * @param mensaje	El mensaje a mostrar
	   */
	  public void mostrarDialogoConfirmacion(String mensaje){
		  
          //Mostramos un dialogo customizado con un boton de OK
          dialogo = new Dialog(this);
          dialogo.setContentView(R.layout.confirmacion_dialog);
          dialogo.setCancelable(false);
          //ponemos la imagen
          ImageView img = (ImageView) dialogo.findViewById(R.id.imagenConfirmacionDialogo);
          img.setImageResource(R.drawable.confirmacion_icon);
          //ponemos el texto del mensaje
          TextView texto = (TextView) dialogo.findViewById(R.id.textoConfirmacionDialogo);
          texto.setText(mensaje);
          //ponemos el boton de OK¡
          Button botonOk = (Button) dialogo.findViewById(R.id.botonConfirmacionDialogo);
          
          botonOk.setOnClickListener(new OnClickListener() {

        	  @Override
              public void onClick(View v) {
        		  //cerramos el dialogo y la activity EditarLugarActivity
                  cerrarDialogo();
              }


          });
          
          //mostramos el dialogo 
          dialogo.show();
		  
	  }
	  
	  
	  /**
	   * Metodo que se encarga de cerrar el dialogo de confirmacion/error
	   */
	  public void cerrarDialogo() {
	  
		  //primero cerramos el dialogo
		  this.dialogo.dismiss();
		  //ahora cerramos el activity
		  this.finish();
			
	  }
	  
	  
	  /**
	   * Metodo que muestra un dialogo personalizado de error
	   * @param mensaje	El mensaje a mostrar
	   */
	  public void mostrarDialogoError(String mensaje){
          //Mostramos un dialogo customizado con un boton de OK
          Dialog dialogo = new Dialog(this);
          dialogo.setContentView(R.layout.error_dialog);
          dialogo.setCancelable(false);
          //ponemos la imagen
          ImageView img = (ImageView) dialogo.findViewById(R.id.imagenErrorDialogo);
          img.setImageResource(R.drawable.error_icon);
          //ponemos el texto del mensaje
          TextView texto = (TextView) dialogo.findViewById(R.id.textoErrorDialogo);
          texto.setText(mensaje);
          //ponemos el boton de OK¡
          Button botonOk = (Button) dialogo.findViewById(R.id.botonErrorDialogo);
          
          botonOk.setOnClickListener(new OnClickListener() {

        	  @Override
              public void onClick(View v) {
        		  //cerramos el dialogo y la activity EditarLugarActivity
                  cerrarDialogo();
              }
          });
          
          //mostramos el dialogo 
          dialogo.show();
		  
	  }
	    
	  
	  /**
	   * Metodo que obtiene el path de una Uri
	   * @param uri		URI de la que obtener el path
	   */
	  public String getPath(Uri uri) {
		  
		  //intentamos obtener el path que apunta a la imagen
		  String[] projection = { MediaStore.Images.Media.DATA };
		  Cursor cursor = managedQuery(uri, projection, null, null, null);
		  //comprobamos que el cursor haya devuelto algo y solo 1 registro
		  if (cursor != null && cursor.getCount() == 1 ) {
			  cursor.moveToFirst();
		      int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		      cursor.moveToFirst();
		      return cursor.getString(column_index);
		       
		  }
		  else{
			  return null;
		  }  
	  }
		
	  /**
	   * Metodo callback que recoge el resultado de llamar a la activity para obtener alguna imagen
	   * @param	requestCode		El codigo de solicitud enviado a la Activity
	   * @param resultCode		El codigo que contiene el resultado de la llamada
	   * @param data			Los datos obtenidos de la activity llamada
	   */
	  @Override
	  public void onActivityResult(int requestCode, int resultCode, Intent data) {
		  
		  //comprobamos que la activity haya vuelto bien
		  if (resultCode == Activity.RESULT_OK && requestCode == SELECT_IMAGE) {
	          //obtenemos la uri de la imagen seleccionada  
			  Uri uriImagenSeleccionada = data.getData();
			  //actualizamos la uriImagen
			  uriImagen = uriImagenSeleccionada.toString();
			  //obtenemos el path 
			  String pathImagen = getPath(uriImagenSeleccionada);
			  Bitmap bm = BitmapFactory.decodeFile( pathImagen, null );
			  mPicture.setImageBitmap(bm);
		  }
	  }
	 
	  /**
	   * Metodo que se llama cuando la activity entra en modo pause
	   */
	  @Override
	  protected void onPause() {
	        super.onPause();
	  }

	  /**
	   * Metodo que se llama cuando la activity vuelve del modo pause
	   */
	  @Override
	  protected void onResume() {
	        super.onResume();
	  }

	
}

